/**
*实验五 - 用栈实现十进制转换成其他进制
*学号： 201531002134
*班级： 软工1601
*/

#include <stdio.h>
#include <string.h>
#include <stdlib.h>

#define STACK_INIT_SIZE 100
#define STACKINCREMENT 10  //存储空间分配增量


typedef struct{
    int *base;
    int *top;
    int stacksize;
}SqStack;

int InitStack(SqStack &s);   //初始化空栈
int isEmpty(SqStack &s);  //获取栈顶元素
int Push(SqStack &s, int e);  //进栈,e表示进栈元素
int Pop(SqStack &s, int &e);  //出栈,e是出栈元素
void TransForm(SqStack &s, int num, int mode);  //进制转换

int main()
{
    int number , mode ;
    SqStack L;
    while(1)
    {
        printf("请先输入一个十进制数：");
        scanf("%d",&number);
        printf("再输入需要转换的进制：");
        scanf("%d",&mode);
        TransForm(L,number,mode);
    }
    return 0;
}

int InitStack(SqStack &s)
{
    s.base = (int *)malloc(STACK_INIT_SIZE*sizeof(int));
    if (!(s.base))
        return 0;
    s.top = s.base;
    s.stacksize = STACK_INIT_SIZE;
    return 1;
}

int isEmpty(SqStack &s)
{
    if ( s.top == s.base)
        return 1;
    else
        return 0;
}

int Push(SqStack &s, int e)
{
    //检查栈是否已满
    if (s.top - s.base >= s.stacksize)
    {
        s.base = (int *)realloc(s.base , (s.stacksize+STACKINCREMENT)*sizeof(int));
        if (!s.base)
            return 0;
        s.top = s.base + s.stacksize;
        s.stacksize += STACKINCREMENT;
    }
    * s.top++  = e;
    return 1;
}

int Pop(SqStack &s, int &e)
{
    //判断栈是否为空
    if (s.top == s.base)
        return 0;
    e = * --s.top;
    return 1;
}

//进制转换
void TransForm(SqStack &s, int num, int mode)
{
    InitStack(s);
    int e;
    printf("十进制%d转换为%d进制为",num,mode);
    while(num)
    {
        Push(s, num % mode);
        num = num / mode;
    }
    while(!isEmpty(s))
    {
        Pop(s,e);
        if (e>9)
            printf("%c",e+55);
        else
            printf("%d",e);
    }
    printf("\n\n");
    free(s.base);
}


